package dao;

import lombok.Data;
import util.PinyinUtil;

import java.io.File;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

// 该类代表 file_meta 数据表里的每一个记录
@Data
public class FileMeta {
    private int id;
    private String name;
    private String path;
    private Boolean isDirectory;
    private long size;
    private long lastModified;

    public String getPinyin(){
        return PinyinUtil.get(name,true);
    }


    public String getPinyinFirst(){
        return PinyinUtil.get(name,false);
    }

    // 该方法将 size 值进行单位换算，变成更简易标准的结果
    public String getSizeText(){
        double curSize = size;
        // 单位主要考虑这五个. Byte,KB,MB,GB,TB
        String[] units = {"Byte","KB","MB","GB","TB"};
        for (int level = 0; level < units.length; level++) {
            if(curSize < 1024){
                return String.format("%.2f " + units[level],new BigDecimal(curSize));
            }
            curSize /= 1024;
        }
        // 当单位升级到TB时还是不够用，后续就以TB为单位
        return String.format("%.2f TB",new BigDecimal(curSize));
    }

    public String getLastModifiedText(){
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(lastModified);
    }

    public FileMeta(String name, String path, Boolean isDirectory, long size, long lastModified) {
        this.name = name;
        this.path = path;
        this.isDirectory = isDirectory;
        this.size = size;
        this.lastModified = lastModified;
    }

    public FileMeta(File file) {
        this(file.getName(), file.getParent(), file.isDirectory(),file.length(),file.lastModified());
    }



    // 重写equals,很多Java相关的编程规范都建议我们重写hashCode和equals
    // 如果两个对象equals的结果为true，那么它们得到的hashCode也是相同的
    @Override
    public boolean equals(Object object){
        // 1, 判断是否为自己与自己进行比较
        if(this == object) return true;
        // 2, 针对object为null的特殊处理
        if(object == null) return false;
        // 3, 类型的比较
        if(getClass() != object.getClass()) return false;
        // 4, 类型相同,根据自定义方式进行比较
        FileMeta fileMeta = (FileMeta) object;
        return name.equals(fileMeta.name) && path.equals(fileMeta.path) && isDirectory.equals(fileMeta.isDirectory);
    }
}
